package kz.kstu.website.web.bean.security;

import kz.kstu.website.entity.enums.AccountRoleEnum;
import kz.kstu.website.entity.security.Account;
import kz.kstu.website.entity.security.AccountRole;
import kz.kstu.website.service.api.AccountService;
import kz.kstu.website.web.validator.captcha.Captcha;
import org.apache.log4j.Logger;
import org.springframework.context.annotation.Scope;
import org.springframework.security.authentication.encoding.PasswordEncoder;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;


/**
 * TODO: Сделать капчу.
 * TODO: Обрабатывать исключение при нарушении уникальности.
 * <p/>
 * User: Dmitry Leontyev
 * Date: 11.12.10
 * Time: 23:25
 */
@Scope("request")
@Named("accountRegisterBean")
public class AccountRegisterBean {
    private static final Logger LOG = Logger.getLogger(AccountRegisterBean.class.getName());

    @PersistenceContext
    private EntityManager em;

    @Inject
    private PasswordEncoder passwordEncoder;

//    @Inject
//    private MailService mailService;

    @Inject
    private AccountService accountService;

    private Account account;

    @Captcha
    private String captchaValue;

    @PostConstruct
    private void retrieveTempAccount() {
        Account flashAccount = (Account) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("registerAccount");
        if (flashAccount != null) {
            account = (Account) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("registerAccount");
            LOG.debug("UserAccount object already create. Use it.");
        } else {
            account = new Account();
            FacesContext.getCurrentInstance().getExternalContext().getFlash().put("registerAccount", account);
            LOG.debug("UserAccount object not found. Create new UserAccount object.");
        }
    }


    @Transactional
    public String doRegister() {

        // todo: Вместо null добавлять Salt
        account.setPassword(passwordEncoder.encodePassword(account.getPassword(), null));
        AccountRole role = em.find(AccountRole.class, AccountRoleEnum.USER.getId());
        account.setRole(role);

        accountService.saveAccount(account);

//        try {
//            mailService.postMail(account);
//        } catch (MessagingException me) {
//            LOG.log(Level.SEVERE, "Ошибка при отправлении почты.", me);
//        }

        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Регистрация прошла успешно. Теперь Вы можете войти в систему как зарегистрированный пользователь", null));

        FacesContext.getCurrentInstance().getExternalContext().getFlash().setKeepMessages(true);
        return "login?faces-redirect=true";
    }

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }

    public String getCaptchaValue() {
        return captchaValue;
    }

    public void setCaptchaValue(String captchaValue) {
        this.captchaValue = captchaValue;
    }
}